# 定义一个字符向量，表示扑克牌的牌面，包含从A（ace）到K（king）等各种牌面名称
faces <- c("ace", "two", "three", "four", "five", "six", "seven",
           "eight", "nine", "ten", "jack", "queen", "king")
# 定义一个字符向量，表示扑克牌的花色，包含红桃（hearts）、梅花（clubs）、方块（diamonds）、黑桃（spades）
suits <- c("hearts", "clubs", "diamonds", "spades")

# 创建一副扑克牌的数据框
# 以下是对数据框各列的说明：
# face列：通过重复faces向量来填充，每个牌面重复对应花色的次数，以组合出所有牌面与花色的组合
# suit列：通过重复suits向量来填充，每种花色重复对应牌面的次数，同样是为了组合出所有牌
# value列：假设A为1，2 - 10按面值，J、Q、K为11、12、13，通过重复1到13这些数值来给每张牌赋予相应的点数
poker_deck <- data.frame(
  face = rep(faces, each = length(suits)),
  suit = rep(suits, times = length(faces)),
  value = rep(1:13, each = length(suits) * length(faces) / 13) # 假设A为1，2-10按面值，J,Q,K为11,12,13
)

# 打印扑克牌数据框的前几行查看结果，方便直观查看数据框的大致结构和内容
head(poker_deck)
# 完整打印扑克牌数据框，展示所有数据
print(poker_deck)
# 提取扑克牌数据框中第1到3行、第2到3列的数据（这里只是一种数据提取示例操作）
poker_deck[1:3, 2:3]
# 提取扑克牌数据框中第1行第1列的数据（同样是数据提取示例操作）
poker_deck[1, 1]
# 提取扑克牌数据框中排除第2行，且排除第1列和第3列的数据（展示不同的索引提取方式）
poker_deck[-2, c(-1, -3)]
# 提取扑克牌数据框中指定行（第12、17、29行）的'face'列的数据（更多数据提取示例）
poker_deck[c(12, 17, 29), 'face']
# 计算扑克牌数据框中'value'列的平均值，查看整副牌点数的平均情况
mean(poker_deck$value)
# 提取扑克牌数据框中排除第5到7行，且选择第2、3列（这里通过逻辑向量T、T来表示选择对应列）的数据
poker_deck[-c(5:7), c(F, T, T)]

# 定义一个名为deal的函数，功能是从传入的扑克牌数据（这里假设是类似poker_deck的数据框结构）中取出第1行数据返回，模拟发牌取出第一张牌的操作
deal <- function(cards) {
  return(cards[1, ])
}
# 调用deal函数，传入poker_deck数据框，打印返回的结果（即模拟发出的第一张牌的数据情况）
print(deal(poker_deck))

# 定义一个名为shuffle的函数，功能是对传入的扑克牌数据框进行洗牌操作
# 具体做法是先从数据框的所有行索引中随机抽样（相当于打乱行顺序），然后按照抽样后的顺序重新排列数据框的行，实现洗牌效果
# （注：代码中后面有部分被注释掉的内容可能是之前尝试不同洗牌方式的残留代码，当前有效的是前面按照行随机抽样重排的方式）
shuffle <- function(poker_deck) {
  order <- poker_deck[sample(nrow(poker_deck)), ]
  #order<-sample(1:52,size=52)
  #poker_deck[order, ]
  return(order)
}

# 调用shuffle函数对poker_deck进行洗牌，并执行该操作（虽然这里没有使用返回值做进一步处理，但完成了洗牌这一动作）
shuffle(poker_deck)
# 调用shuffle函数对poker_deck进行洗牌，并将洗牌后的结果赋值给deck1变量
deck1 <- shuffle(poker_deck)
# 将deck1数据框中牌面为"ace"的牌对应的'value'值修改为14（改变了特定牌的点数赋值规则）
deck1$value[deck1$face == "ace"] <- 14
# 打印deck1数据框，查看修改点数后的牌的数据情况
print(deck1)
# 再次调用shuffle函数对poker_deck进行洗牌，并将结果赋值给deck2变量
deck2 <- shuffle(poker_deck)
# 将deck2数据框中所有牌的'value'值初始化为0
deck2$value <- 0
# 将deck2数据框中花色为'hearts'的牌对应的'value'值修改为1
deck2$value[deck2$suit == 'hearts'] <- 1
# 将deck2数据框中花色为'spades'且牌面为'queen'的牌对应的'value'值修改为13，进一步按照特定规则设置牌的点数
deck2$value[deck2$suit =='spades' & deck2$face == 'queen'] <- 13
# 打印deck2数据框，查看按新规则设置点数后的牌的数据情况
print(deck2)
# 统计deck2数据框中'value'值等于1的牌的数量，并打印结果
print(sum(deck2$value == 1))
# 又一次调用shuffle函数对poker_deck进行洗牌，并将结果赋值给deck3变量
deck3 <- shuffle(poker_deck)
# 将deck3数据框中牌面为'jack'、'queen'、'king'的牌对应的'value'值修改为10，再次按特定规则改变牌的点数设置
deck3$value[deck3$face %in% c('jack', 'queen', 'king')] <- 10
# 打印deck3数据框，查看最新修改点数后的牌的数据情况
print(deck3)
